home *** CD-ROM | disk | FTP | other *** search
/ MacFormat 1995 March / macformat-022.iso / Shareware City / Developers / MW MPW Binaries 1.1.1a2 / mwcPPC / MWCIncludes / bitstring < prev    next >
Encoding:
Text File  |  1994-07-18  |  3.8 KB  |  133 lines  |  [TEXT/MMCC]

  1. // bitstring standard header
  2. #ifndef _BITSTRING_
  3. #define _BITSTRING_
  4. #include <string>
  5.  
  6. #if __MWERKS__
  7. #pragma options align=mac68k
  8. #endif
  9.  
  10.         // class bitstring
  11. string _Bitsxstr(istream&, size_t);
  12. class bitstring {
  13. public:
  14.     typedef unsigned long _T;
  15.     enum {_Nb = _BITS_BYTE * sizeof (_T)};
  16.     enum _Source {_Zeros = 0, _Ones = -1};
  17.     bitstring()
  18.         {_Tidy(); }
  19.     bitstring(unsigned long, size_t);
  20.     bitstring(const bitstring& _X, size_t _P = 0,
  21.         size_t _N = NPOS)
  22.         {_Tidy(), assign(_X, _P, _N); }
  23.     bitstring(const string&, size_t = 0, size_t = NPOS);
  24.     bitstring(_Source _S)
  25.         : _Ptr(0), _Src(_S), _Len(0), _Res(0) {}
  26.     ~bitstring()
  27.         {_Tidy(1); }
  28.     bitstring& operator=(const bitstring& _R)
  29.         {return (assign(_R)); }
  30.     bitstring& operator+=(const bitstring& _R)
  31.         {return (append(_R)); }
  32.     bitstring& operator&=(const bitstring&);
  33.     bitstring& operator|=(const bitstring&);
  34.     bitstring& operator^=(const bitstring&);
  35.     bitstring& operator<<=(size_t);
  36.     bitstring& operator>>=(size_t);
  37.     bitstring& append(const bitstring&, size_t = 0,
  38.         size_t = NPOS);
  39.     bitstring& assign(const bitstring&, size_t = 0,
  40.         size_t = NPOS);
  41.     bitstring& insert(size_t, const bitstring&, size_t = 0,
  42.         size_t = NPOS);
  43.     bitstring& remove(size_t = 0, size_t = NPOS);
  44.     bitstring& replace(size_t, size_t, const bitstring&,
  45.         size_t = 0, size_t = NPOS);
  46.     bitstring& set();
  47.     bitstring& set(size_t, _Bool = 1);
  48.     bitstring& reset();
  49.     bitstring& reset(size_t _P)
  50.         {return (set(_P, 0)); }
  51.     bitstring& toggle();
  52.     bitstring& toggle(size_t);
  53.     string to_string() const;
  54.     size_t count() const;
  55.     size_t length() const
  56.         {return (_Len); }
  57.     size_t resize(size_t, _Bool = 0);
  58.     size_t trim()
  59.         {resize(rfind(1) + 1);
  60.         return (_Len); }
  61.     size_t find(_Bool, size_t = 0, size_t = NPOS) const;
  62.     size_t rfind(_Bool, size_t = 0, size_t = NPOS) const;
  63.     bitstring substr(size_t _P, size_t _N = NPOS) const
  64.         {return (bitstring(*this, _P, _N)); }
  65.     _Bool operator==(const bitstring&) const;
  66.     _Bool operator!=(const bitstring& _R) const
  67.         {return (!(*this == _R)); }
  68.     _Bool test(size_t) const;
  69.     _Bool any() const;
  70.     _Bool none() const
  71.         {return (!any()); }
  72.     bitstring operator<<(size_t _R) const
  73.         {return (bitstring(*this) <<= _R); }
  74.     bitstring operator>>(size_t _R) const
  75.         {return (bitstring(*this) >>= _R); }
  76.     bitstring operator~() const
  77.         {return (bitstring(*this).toggle()); }
  78.     _T _W(int _I) const
  79.         {return (_Ptr[_I]); }
  80.     _T _X(int _I, int _P) const
  81.         {int _L = _Len == 0 ? -1 : (_Len - 1) / _Nb;
  82.         return (_L < _I ?  _Src : _P == 0 ? _Ptr[_I]
  83.             : _L == _I ? _Ptr[_I] << _P
  84.             : _Ptr[_I] << _P | _Ptr[_I + 1] >> _Nb - _P); }
  85. private:
  86.     void _Copylr(const bitstring&, size_t, size_t, size_t);
  87.     void _Copyrl(const bitstring&, size_t, size_t, size_t);
  88.     _Bool _Grow(size_t, _Bool = 0);
  89.     void _Setl(size_t _L)
  90.         {_Len = _L, _L %= _Nb;
  91.         if (_L != 0)
  92.             _Ptr[(_Len - 1) / _Nb] &= ~(~(_T)0 >> _L); }
  93.     void _Tidy(_Bool = 0);
  94.     void _Xinv() const
  95.         {invalidargument("invalid bitstring char").raise(); }
  96.     void _Xlen() const
  97.         {lengtherror("bitstring too long").raise(); }
  98.     void _Xran() const
  99.         {outofrange("invalid bitstring position").raise(); }
  100.     _T *_Ptr, _Src;
  101.     size_t _Len, _Res;
  102.     };
  103.         // operators
  104. inline bitstring operator+(const bitstring& _L,
  105.     const bitstring& _R)
  106.     {return (bitstring(_L) += _R); }
  107. inline bitstring operator&(const bitstring& _L,
  108.     const bitstring& _R)
  109.     {return (bitstring(_L) &= _R); }
  110. inline bitstring operator|(const bitstring& _L,
  111.     const bitstring& _R)
  112.     {return (bitstring(_L) |= _R); }
  113. inline bitstring operator^(const bitstring& _L,
  114.     const bitstring& _R)
  115.     {return (bitstring(_L) ^= _R); }
  116. inline istream& operator>>(istream& _I, bitstring& _R)
  117.     {_R = _Bitsxstr(_I, NPOS - 1);
  118.     return (_I); }
  119. inline ostream& operator<<(ostream& _O, const bitstring& _R)
  120.     {return (_O << _R.to_string()); }
  121.  
  122. #if __MWERKS__
  123. #pragma options align=reset
  124. #endif
  125.  
  126. #endif
  127.  
  128. /*
  129.  * Copyright (c) 1994 by P.J. Plauger.  ALL RIGHTS RESERVED. 
  130.  * Consult your license regarding permissions and restrictions.
  131.  */
  132.  
  133.